home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
vol_100
/
171_01
/
ios1_20.asm
< prev
next >
Wrap
Assembly Source File
|
1983-10-25
|
8KB
|
318 lines
title Level 1 I/O Functions for Lattice 'c' Version 1.04
page 64,132
name IOS1_20 ;DOS function calls 3DH, 3EH, 3FH, 40H, AND 42H.
comment |
These functions take advantage of DOS 2.0 and will directly
replace the original level 1 I/O except that 'text mode' is
not supported. DOS error numbers are saved at ERRNO and may be
checked by including: "extern short errno;" in your source files.
Note that the pmode parameter in creat is forced to zero, due to
a problem with Lattice's freopen which passes a 1A4H to creat.
Ted Reuss c/o South Texas Software, Inc.
Home: 713/961-3926 4544 Post Oak Place, Suite 176
Offi: 713/877-8205 Houston, Tx 77027
|
public CREAT, OPEN, CLOSE, READ, WRITE, LSEEK
dgroup group data
data segment word public 'data'
assume ds:dgroup
public ERRNO
ERRNO dw 0 ; DOS error number (DOS Manual page D-14)
data ends
pgroup group prog
prog segment byte public 'prog'
assume cs:pgroup
subttl CREAT -- create a new file
page
;
; NAME
; creat -- create a new file
;
; SYNOPSIS
;
; file = creat(name, pmode);
; int file; file number or error code
; char *name; file name (valid drive\path\filespec)
; int pmode; access privilege mode bits, DOS attribute
; NOTE: forced to zero in current version.
;
; DESCRIPTION
;
; Creates a new file with the specified name and prepares is
; for access via the level 1 I/O functions. The file name
; may consist of a valid drive and path name. All I/O is
; done via DOS calls 3fh (READ) and 40h (WRITE). If the file
; already exists, it's contents are discarded. The current file
; position and the end of file are both zero. (indicating an
; empty file) if the function is successful. ERRNO is set to
; the error number returned by DOS in the event of an error.
;
; RETURNS
; file = file number to access file, if successful
; = -1 if error (ERRNO get DOS error number)
;
public CREAT
CREAT proc near
push bp
mov bp,sp
mov dx,[bp+4] ;get ptr to drive\path\filespec
xor cx,cx
mov ah,3CH ;DOS create function
int 21H
jnc cre10
mov dgroup:errno,ax
mov ax,-1
cre10: mov sp,bp
pop bp
ret
CREAT endp
subttl OPEN -- open a file
page
;
; NAME
; open -- open a file
;
; SYNOPSIS
;
; file = open(name, rwmode);
; int file; file number or error code
; char *name; file name (valid drive\path\filespec)
; int rwmode; read/write mode, where 0=read, 1=write,
; 2=read/write
;
; DESCRIPTION
;
; Opens a file for access using the level 1 I/O functions.
; The file name may contain a valid drive and path name. All
; I/O is done via DOS functions 3fh (READ) and 40h (WRITE).
; The mode word determines the type of I/O which will be
; performed on the file. The low order bits specify whether
; read or write operations (or both) are to be allowed.
; In the event of an error the error code passed by DOS is
; saved at ERRNO.
;
; RETURNS
;
; file = file number to access file, if successful
; = -1 if error (ERRNO get DOS error number)
;
public OPEN
OPEN proc near
push bp
mov bp,sp
mov dx,[bp+4] ;get ptr to drive\path\filespec
mov ax,[bp+6] ;get mode
mov ah,3DH ;DOS open function
int 21H
jnc opn10
mov dgroup:errno,ax
mov ax,-1
opn10: mov sp,bp
pop bp
ret
OPEN endp
subttl CLOSE -- close a file
page
;
; NAME
;
; close -- close a file
;
; SYNOPSIS
;
; status = close(file);
; int status; status code: 0 if successful
; int file; file number for file
;
; DESCRIPTION
;
; Close a file and frees the file number for use in accessing
; another file. Any buffers allocated when the file was
; opened are released.
;
; RETURNS
;
; status = 0 if successful
; = -1 if error (ERRNO get DOS error number)
;
public CLOSE
CLOSE proc near
push bp
mov bp,sp
mov bx,[bp+4] ;get file handle
mov ah,3EH ;DOS close function
int 21H
jc clo10
xor ax,ax
jmp short clo20
clo10: mov dgroup:errno,ax
mov ax,-1
clo20: mov sp,bp
pop bp
ret
CLOSE endp
subttl READ -- read data from file
page
;
; NAME
;
; read -- read data from file
;
; SYNOPSIS
;
; status = read(file, buffer, length);
; int status; status code or actual length
; int file; file number for file
; char *buffer; input buffer
; int length; number of bytes requested
;
; DESCRIPTION
;
; Reads the next set of bytes from a file. The return count
; is always equal to the number of bytes placed in the buffer
; and will never exceed the "length" parameter, except in the
; case of an error, where -1 is returned. The file position
; is advanced accordingly.
;
; RETURNS
;
; status = 0 if end of file
; = -1 if error (ERRNO get DOS error number)
; = number of bytes actually read, otherwise
;
public READ
READ proc near
push bp
mov bp,sp
mov bx,[bp+4] ;get file handle
mov dx,[bp+6] ;get buffer address
mov cx,[bp+8] ;get byte count
mov ah,3FH ;DOS read function
int 21H
jnc red10
mov dgroup:errno,ax
mov ax,-1
red10: mov sp,bp
pop bp
ret
READ endp
subttl WRITE -- write data to file
page
;
; NAME
;
; write -- write data to file
;
; SYNOPSIS
;
; status = write(file, buffer, length);
; int status; status code or actual length
; int file; file number for file
; char *buffer; output buffer
; int length; number of bytes in buffer
;
; DESCRIPTION
;
; Writes the next set of bytes to a file. The return count is
; equal to the number of bytes written, unless an error
; occurred. The file position is advanced accordingly.
;
; RETURNS
;
; status = -1 if error (ERRNO get DOS error number)
; = number of bytes actually written otherwise
;
public WRITE
WRITE proc near
push bp
mov bp,sp
mov bx,[bp+4] ;get file handle
mov dx,[bp+6] ;get buffer address
mov cx,[bp+8] ;get byte count
mov ah,40H ;DOS write function
int 21H
jnc wrt10
mov dgroup:errno,ax
mov ax,-1
wrt10: mov sp,bp
pop bp
ret
WRITE endp
subttl LSEEK -- seek to specified file position
page
;
; NAME
;
; lseek -- seek to specified file position
;
; SYNOPSIS
;
; pos = lseek(file, offset, mode);
; long pos; returned file position or error code
; int file; file number for file
; long offset; desired position
; int mode; offset mode relative to:
; 0 = beginning of file BOFM
; 1 = current file position CURM
; 2 = end of file EOFM
;
; DESCRIPTION
;
; Changes the current file position to a new position in the
; file. The offset is specified as a long int and is added to
; the current position (mode 1) or to the logical end of file
; (mode 2). Use DOS function 42h (LSEEK).
;
; RETURNS
;
; pos = -1L if error occurred (ERRNO get DOS error number)
; = new file position if successful
;
public LSEEK
LSEEK proc near
push bp
mov bp,sp
mov bx,[bp+4] ;get file handle
mov dx,[bp+6] ;get low word of pos
mov cx,[bp+8] ;get high word of pos
mov ax,[bp+10] ;get seek mode
mov ah,42H ;DOS lseek function
int 21H
jnc lsk10
mov dgroup:errno,ax
mov ax,-1
mov dx,ax
lsk10: mov bx,ax
mov ax,dx
mov sp,bp
pop bp
ret
LSEEK endp
prog ends
end
roup:errno,ax
mov ax,-1
mov dx,ax
lsk10: mov bx,ax
mov ax,dx
mov sp,bp
pop bp
ret
LSEEK endp